前面我們介紹了ACID事務處理模型,
意思是當我們在處理一個事務時,會符合ACID這四個特性來處理事務,
但事務處理模型其實不只ACID一種,部分資料的存取並不需要如此嚴格的ACID機制,
因此誕生了鼎鼎大名的BASE事務處理模型。
我們將會介紹BASE事務處理模型所關注的事情。
事務處理模型,指的就是當我們TX開始到結束,處理資料時會符合哪些規則。
如果以簡單的區分,將會這樣區分
基本介紹BASE
可以看到重點其實就是軟狀態(S-oft State),這裡就必須開始引入網路系統的概念(並非單指分散式系統)了,
資料的處理已經不是在同一個process上做處理,可能是同一台電腦(node),不同個process上,同時處理資料傳遞,
亦或是多台電腦(node),同時處理同一份資料的傳遞。
舉個例子:
讀寫分離是一種系統架構,一個master寫,多個slave讀,中間使用wal log來做資料同步,
關鍵就是在同步這件事情有時間差。所以master與slave之間一定會發生軟狀態,雖然會發生軟狀態,
但最後還是有最終一致性(E-ventual consistency)。
至於為什麼ACID不會是BASE事務處理模型的資料庫需要考量的問題呢?
我們可以一條一條來檢視
原子性(Atomicity): tx到rollback可以順利回到原始狀態。而在BASE模型中,強調可用性和性能,因此可能允許事務的一部分操作成功,而另一部分失敗,而不會要求回滾整個事務。
一致性(Consistency): BASE模型下的一致性要求比較寬鬆,所以並不太在意table定義的約束。
隔離性(Isolation): BASE 模型通常更強調可用性和性能,並且可能允許一定程度的隔離欠佳。
持久性(Durability): BASE 模型部分允許一些操作的結果暫時不被持久化,以提高性能。這可能導致在某些情況下,資料的持久性不如ACID模型那麼強。雖然BASE 模型不使用WAL,但在實際應用中,可以實現某種形式的數據持久性保護機制,以確保資料不會輕易丟失。這可能包括定期的數據備份、複製資料到不同的節點以實現冗余,以及使用異步寫入等方式來提高資料的持久性。
再來看看這張圖
一開始可能會覺得怪怪的,後面覺得還不錯?這個感覺就對了。
忠實呈現了軟狀態(S-oft State)與最終一致性(E-ventual consistency)。
請不要和事務處理模型搞混,上面講的是TX開始到結束,處理資料時會符合哪些規則。
而這裡講的是系統的特性,想表達的是只當你要設計一個分散式系統時,每個節點上的資料如何同步,強一致性與可用性等等該如何權衡。
這裡強調的是
"在分散式系統中,不可能同時滿足上面三個性質,最多只能同時滿足兩個。"
最多只能同時滿足兩個, C3取2=3 所以有三種選擇
C-onsistency A-vailability: 強一致性且不返回錯誤=>只有單機才可能不腦裂或斷線。
C-onsistency P-artition Tolerance: 強一致性且腦裂可正常運作=>為了保持強一致性,所以掉線就卡死或需要重來
A-vailability P-artition Tolerance: 服務基本上保持可用且腦裂可正常運作=>結果可能不是最新的(NoSQL強調的就是Availablity,也就是系統保證運作,但是可能返回的結果不是最新的)
這裡介紹了另外一種思考思維,TX不一定要維持ACID,還有BASE可以考慮。
當要設計分散式系統資料如何同步時,CAP只有C3取2。
CAP只有C3取2,聽起來似乎簡單,
但通常非技術人員的spec都會是C3取3,
這時我們就必須想辦法盡量貼近需求,這就是CRUD仔的價值所在啦!